﻿/**
 * Campo (de un formulario de contacto):
 * Precondición: el símbolo al cual se aplica tiene un texto llamado "texto".
 * Atributos/propiedades: valor: El valor del texto ingresado por el usuario.
 * Funciones/métodos: encender, apagar, aplicar, más los mismos que TextFieldEvent
 * Eventos que difunde: "setFocus", "killFocus", "changed" (los mismos que TextFieldEvent).
 * Nombres reservados: encender, apagar, Campo_ref_124416, Campo_inicializar_124416, transicion_encender, transicion_apagar, más los mismos que ControladorCampoBasico, EventDispatcherWrapper y TextFieldEvent.
 *
 * Realiza la detección de eventos del usuario: rollOver, rollOut, release, releaseOutside y press.
 *
 */
class Campo {
	// auxiliary to not to get a compiler error
	private var texto:TextField;

	private var encendido:Boolean;
	private var Campo_ref_124416:Campo;

	public static var wrap:Function = aplicar;
	private var campo_receptor:TextField;
	
	private var transicion_encender,
	transicion_apagar:Transicion;
	
	/**
	 * @param transiciones: Object = {transicion_encender, transicion_apagar, transicion_resaltar, transicion_desresaltar}
	 */
	public static function aplicar(receptor:MovieClip/*, transiciones:Object*/):MovieClip {
		// For some compilers that force to asign new objects to a variable.
		var boton:Campo = new Campo(receptor, {}/*transiciones*/);
		return receptor;
	}
	
	public function Campo(receptor:MovieClip, transiciones:Object) {
		//trace("Campo: " + receptor);
		EventDispatcherWrapper.aplicar(receptor);
		TextFieldEvent.aplicar(receptor.texto);
		ControladorCampoBasico.aplicar(receptor.texto);
		/* TODO Los atributos que no vengan definidos reemplazarlos por una transición predeterminada. */
		transicion_encender = transiciones.transicion_encender;
		transicion_apagar = transiciones.transicion_apagar;
		
		receptor.Campo_ref_124416 = this;
		receptor.Campo_ref_124416.campo_receptor = receptor;
		receptor.Campo_inicializar_124416 = Campo_inicializar_124416;
		receptor.encender = encender;
		receptor.apagar = apagar;
		receptor.get_valor = get_valor;
		receptor.set_valor = set_valor;
		receptor.Campo_inicializar_124416();
	}

	private function Campo_inicializar_124416():Void {
		Campo_ref_124416.transicion_encender.addEventListener("fin_transicion", Campo_ref_124416);
		Campo_ref_124416.transicion_apagar.addEventListener("fin_transicion", Campo_ref_124416);
		addProperty("valor", get_valor, set_valor);
	}

	public function fin_transicion(evt:Object):Void {
		var type:String;
		switch(evt.target) {
			case transicion_encender:
			type = "fin_encender";
			break;
			case transicion_apagar:
			type = "fin_apagar";
			break;
		}
		// redifusión del mismo evento, con el target modificado al esperado por el usuario
		evt.target = campo_receptor;
		campo_receptor.dispatchEvent(evt);
	}
	
	public function encender():Void {
		Campo_ref_124416.transicion_apagar.cancelar();
		Campo_ref_124416.transicion_encender.hacer_gradual();
	}
	
	public function apagar():Void {
		Campo_ref_124416.transicion_encender.cancelar();
		Campo_ref_124416.transicion_apagar.hacer_gradual();
	}

	public function get_valor():String {
		return texto.text;
	}
	
	public function set_valor(valor:String):Void {
		texto.text = valor;
	}
}